﻿//===============================================================================
// Apolineo Patterns & Practices LeanEngine Framework
//===============================================================================
// Copyright © Apolineo Desenvolvimento de Sistemas Ltda.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================

using System;
using System.Windows.Forms;
using LeanEngine.Entity;
using LeanEngine.Extensions;
using LeanEngine.SalesConcept.Business;
using LeanEngine.SalesConcept.Entity;
using LeanEngine.Exception;

namespace LeanEngine.SalesConcept.Windows
{
    //Formulário que contem a lógica de implementação da funcionalidade de manutenção
    //de clientes e utiliza o user control de manutenção criado
    public partial class FormMaintenanceCustomer : Form
    {
        //Evento para fornecer uma interface de extensão do comportamento do formulario
        public event Action<FormMaintenanceCustomer, Customer> SaveSuccess;

        public FormMaintenanceCustomer()
        {
            InitializeComponent();
        }

        internal void SetControlsValues(Customer value)
        {
            this.maintenanceControlOfCustomer1.SetControlsValues(value);
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            //Através do controle de integração dos validadores com controles de tela
            //PropertyValidatorProvider (LeanEngine.Validation.Windows.Forms) o lob se encarregra de
            //executar os validadores passando os valores do controle e retornando
            //na propriedade ErrorMessages as mensagens dos erros (caso exista)
            if (this.ValidateChildren())
            {
                var bo = new SaleBusinessFacade(Program.LoginToken);
                var dto = this.maintenanceControlOfCustomer1.GetControlsValues();

                try
                {
                    if (dto.Id.IsGreaterThan(0)) bo.UpdateCustomer(dto);
                    else bo.InsertCustomer(dto);

                    MessageBox.Show("Operação concluída com sucesso.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.maintenanceControlOfCustomer1.ClearControls();
                    if (SaveSuccess.IsNotNull()) SaveSuccess.Invoke(this, dto);
                }
                catch (BusinessException ex)
                {
                    MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show(this.maintenanceControlOfCustomer1.ErrorMessages, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
